package com.proyecto.track.bo;

import java.util.HashSet;
import java.util.Set;

import javax.persistence.*;

import com.proyecto.track.action.dto.UsuarioDTO;

/**
 * La clase Usuario.
 */
@Entity
public class Usuario {
	
	/** El id usuario. */
	private Long idUsuario;
	
	/** El nombre completo. */
	private String nombreCompleto;
	
	/** Las tareas. */
	private Set<Tarea> tareas = new HashSet<Tarea>();
	
	/** Los proyectos. */
	private Set<Proyecto> proyectos = new HashSet<Proyecto>();
	
	/** Los proyectos administrados. */
	private Set<Proyecto> proyectosAdministrados = new HashSet<Proyecto>();
	
	/** El nombre. */
	private String nombre;
	
	/** La clave. */
	private String clave;
	
	private Set<Rol> roles = new HashSet<Rol>();
	
	/** Flag de habilitacion. */
	private boolean habilitado;
	
	@Id
	@GeneratedValue
	public Long getIdUsuario() {
		return idUsuario;
	}
	
	public void setIdUsuario(Long idUsuario) {
		this.idUsuario = idUsuario;
	}
	public String getNombreCompleto() {
		return nombreCompleto;
	}
	public void setNombreCompleto(String nombreCompleto) {
		this.nombreCompleto = nombreCompleto;
	}
	public String getNombre() {
		return nombre;
	}
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public String getClave() {
		return clave;
	}
	public void setClave(String clave) {
		this.clave = clave;
	}
	
	public void setTareas(Set<Tarea> tareas) {
		this.tareas = tareas;
	}

	@ManyToMany(mappedBy="asignados")
	public Set<Tarea> getTareas() {
		return tareas;
	}
	public void setProyectos(Set<Proyecto> proyectos) {
		this.proyectos = proyectos;
	}

	@ManyToMany(mappedBy="recursosAsignados")
	public Set<Proyecto> getProyectos() {
		return proyectos;
	}
	public void setProyectosAdministrados(Set<Proyecto> proyectosAdministrados) {
		this.proyectosAdministrados = proyectosAdministrados;
	}

	@OneToMany
	@JoinColumn(name="idUsuario")
	public Set<Proyecto> getProyectosAdministrados() {
		return proyectosAdministrados;
	}



	/**
	 * Agrega el proyecto al usuario.
	 * 
	 * @param proyecto a agregar
	 *          
	 */
	public void addProyecto(Proyecto proyecto) {
		this.proyectos.add(proyecto);
		
	}

	/**
	 * Remueve la tarea del usuario.
	 * 
	 * @param tarea a remover
	 *            
	 */
	public void removeTarea(Tarea tarea) {
		this.tareas.remove(tarea);
		
	}

	/**
	 * Remueve el proyecto del usuario.
	 * 
	 * @param proyecto a remover
	 *            
	 */
	public void removeProyecto(Proyecto proyecto) {
		this.proyectos.remove(proyecto);
		
	}

	/**
	 * Remueve el proyecto que administra el usuario.
	 * 
	 * @param proyecto a remover
	 *           
	 */
	public void removeProyectoAdministrado(Proyecto proyecto) {
		this.proyectosAdministrados.remove(proyecto);
		
	}

	public void setRoles(Set<Rol> roles) {
		this.roles = roles;
	}

	@ManyToMany(cascade={CascadeType.ALL})
	public Set<Rol> getRoles() {
		return roles;
	}

	public void setHabilitado(boolean habilitado) {
		this.habilitado = habilitado;
	}

	public boolean isHabilitado() {
		return habilitado;
	}
	
	public UsuarioDTO toDTO(){
		return new UsuarioDTO(this);
	}

	public void addRol(Rol rol) {
		this.roles.add(rol);
		
	}
	

	
}
